/* array_utils.h */
#ifndef ARRAY_UTILS_H
#define ARRAY_UTILS_H

// 二维数组访问宏
#define ACCESS_2D(array, i, j, cols) ((array)[(i) * (cols) + (j)])

// 三维数组访问宏
#define ACCESS_3D(array, i, j, k, cols, depth) ((array)[((i) * (cols) * (depth)) + ((j) * (depth)) + (k)])

// 宏：分配二维数组
// arr_ptr: 指向二维数组指针的指针 (e.g., int ***)
// type: 数组元素的类型 (e.g., int)
// rows: 行数
// cols: 列数
// error_action: 内存分配失败时的操作 (e.g., return -1;)
#define ALLOCATE_2D_ARRAY(arr_ptr, type, rows, cols, error_action) \
    do { \
        *(arr_ptr) = (type **)malloc((rows) * sizeof(type *)); \
        if (*(arr_ptr) == NULL) { \
            perror("Failed to allocate memory for array rows"); \
            error_action; \
        } \
        for (int i_alloc = 0; i_alloc < (rows); i_alloc++) { \
            (*(arr_ptr))[i_alloc] = (type *)malloc((cols) * sizeof(type)); \
            if ((*(arr_ptr))[i_alloc] == NULL) { \
                perror("Failed to allocate memory for array columns"); \
                for (int k_alloc = 0; k_alloc < i_alloc; k_alloc++) { \
                    free((*(arr_ptr))[k_alloc]); \
                } \
                free(*(arr_ptr)); \
                *(arr_ptr) = NULL; \
                error_action; \
            } \
        } \
    } while (0)

// 宏：释放二维数组
// arr_ptr: 指向二维数组的指针 (e.g., int **)
// rows: 行数
#define FREE_2D_ARRAY(arr_ptr, rows) \
    do { \
        if ((arr_ptr) != NULL) { \
            for (int i_free = 0; i_free < (rows); i_free++) { \
                free((arr_ptr)[i_free]); \
            } \
            free(arr_ptr); \
            (arr_ptr) = NULL; \
        } \
    } while (0)

#endif /* ARRAY_UTILS_H */